/*
 * MoveableObjects.h
 *
 *  Created on: 04.10.2012
 *      Author: Caffeine
 */

#ifndef MOVEABLEOBJECTS_H_
#define MOVEABLEOBJECTS_H_

#include <IReferenceCounted.h>
#include "PositionObject.h"
#include <ISerializationObject.h>

namespace irr{
namespace object{

/***
 * @class MoveableObjects
 * Класс двигающегося объекта. Необходимо включить в наследники нужного класса и переопредилить необходимые методы
 * */
class MoveableObjects:public virtual irr::IReferenceCounted,public virtual ISerializationObject{
private:
	irr::core::vector3df direction;
public:
	virtual ~MoveableObjects(){}

	MoveableObjects(){
		direction.set(1,0,0);
	}

	/***
	 * Устаналивает напровление движения
	 *
	 * @param vec новое направление движения
	 */
	inline virtual void setMoveDirection(irr::core::vector3df vec){
		direction=vec;
	}

	/***
	 * Возвращяет напровление движения
	 *
	 * @return напровление движения
	 */
	inline irr::core::vector3df getMoveDirection(){
		return direction;
	}

	/***
	 * Возвращяет вектор движения (сдвига) в лево относительно вектора направления
	 */
	inline irr::core::vector3df getShiftLeftDirection(){
		return getMoveDirection().crossProduct(irr::core::vector3df(0,1,0));
	}

	/***
	 * Двигаться вперёд
	 *
	 * @param deltatime время отрисовки кадра
	 */
	virtual void move(irr::f32 deltatime)=0;

	/***
	 * Двигаться назад
	 *
	 * @param deltatime время отрисовки кадра
	 */
	virtual void moveBack(irr::f32 deltatime)=0;

	/***
	 * Двигаться в лево (не путать с поворотом)
	 *
	 * @param deltatime время отрисовки кадра
	 */
	virtual void shiftLeft(irr::f32 deltatime)=0;

	/***
	 * Двигаться в право (не путать с поворотом)
	 *
	 * @param deltatime время отрисовки кадра
	 */
	virtual void shiftRight(irr::f32 deltatime)=0;

	/***
	 * Вызывается если изменился статус движения вперёд
	 *
	 * @param start TRUE если движение началось, иначе FALSE
	 */
	virtual void onChangeMoveStatus(bool start){}

	/***
	 * Вызывается если изменился статус движения назад
	 *
	 * @param start TRUE если движение началось, иначе FALSE
	 */
	virtual void onChangeMoveBackStatus(bool start){}

	/***
	 * Вызывается если изменился статус движения в лева
	 *
	 * @param start TRUE если движение началось, иначе FALSE
	 */
	virtual void onChangeShiftLeftStatus(bool start){}

	/***
	 * Вызывается если изменился статус движения в права
	 *
	 * @param start TRUE если движение началось, иначе FALSE
	 */
	virtual void onChangeShiftRightStatus(bool start){}
};

}//namespace object
}//namespace irr

#endif /* MOVEABLEOBJECTS_H_ */
